package exploits

import (
	"bytes"
	"net"
	"prismx_cli/core/models"
	"prismx_cli/utils/netUtils"
	"strconv"
	"time"
)

// init 注册插件插件
func init() {
	const (
		pkt = "\x00" +
			"\x00\x00\xc0" +
			"\xfeSMB@\x00" +
			"\x00\x00" +
			"\x00\x00" +
			"\x00\x00" +
			"\x00\x00" +
			"\x1f\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"$\x00" +
			"\x08\x00" +
			"\x01\x00" +
			"\x00\x00" +
			"\x7f\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"x\x00" +
			"\x00\x00" +
			"\x02\x00" +
			"\x00\x00" +
			"\x02\x02" +
			"\x10\x02" +
			"\x22\x02" +
			"$\x02" +
			"\x00\x03" +
			"\x02\x03" +
			"\x10\x03" +
			"\x11\x03" +
			"\x00\x00\x00\x00" +
			"\x01\x00" +
			"&\x00" +
			"\x00\x00\x00\x00" +
			"\x01\x00" +
			"\x20\x00" +
			"\x01\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00\x00\x00" +
			"\x00\x00" +
			"\x03\x00" +
			"\x0e\x00" +
			"\x00\x00\x00\x00" +
			"\x01\x00" + //CompressionAlgorithmCount
			"\x00\x00" +
			"\x01\x00\x00\x00" +
			"\x01\x00" + //LZNT1
			"\x00\x00" +
			"\x00\x00\x00\x00"
	)
	models.Register(models.AppVulInfo{
		App:   "microsoft-ds",
		Query: "protocol:\"microsoft-ds\"",
		Meta: models.VulMeta{
			Name:        "CVE-2020-0796 SmbGhost Vulnerable",
			Tags:        []string{"RCE"},
			Author:      "一曲成殇",
			Description: "2020年3月10日，微软在其官方SRC发布了CVE-2020-0796的安全公告（ADV200005，MicrosoftGuidance for Disabling SMBv3 Compression）,公告表示在Windows SMBv3版本的客户端和服务端存在远程代码执行漏洞。同时指出该漏洞存在于MicroSoft Server Message Block 3.1.1协议处理特定请求包的功能中，攻击者利用该漏洞可在目标SMB Server或者Client中执行任意代码。",
			Homepage:    "https://microsoft.com",
			Level:       3,
			References:  "https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796",
			Solution:    "官网更新补丁：https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796",
			CreateAt:    "2021-12-07",
			Steps: models.StepsMeta{VerifySteps: models.VerifySteps{VerifyGo: func(scheme, ip string, port int, duration time.Duration) (result models.VulResult) {

				conn, err := netUtils.SendDialTimeout("tcp", net.JoinHostPort(ip, strconv.Itoa(port)), duration)
				if err != nil {
					return
				}
				defer conn.Close()
				_, err = conn.Write([]byte(pkt))
				if err != nil {
					return
				}
				buff := make([]byte, 1024)
				err = conn.SetReadDeadline(time.Now().Add(duration))
				n, err := conn.Read(buff)
				if err != nil {
					return
				}
				if bytes.Contains(buff[:n], []byte("Public")) && len(buff[:n]) >= 76 && bytes.Equal(buff[72:74], []byte{0x11, 0x03}) && bytes.Equal(buff[74:76], []byte{0x02, 0x00}) {
					result.State = true
					result.Request = pkt
					result.Response = string(buff[:n])
				}
				return result
			},
			},
			},
		},
	})
}
